;################################
;## ABSTRACCION HECHOS BASICOS ##
;################################
;# Este modulo se encarga de abstraer la informacion concreta obtenida en
;# el modulo anterior, para poder relacionar mas adelante la persona con
;# los ejercicios. El ejemplo mas claro es el de la edad: pasamos de un
;# valor numerico a una clasificacion que hemos definido previamente, en
;# este caso {infante, adulto, mayor}. Estos valores los podremos relacionar con
;# la intensidad de los diferentes ejercicios.
(defmodule modulo-abstraccion
    (import MAIN ?ALL)
    (import modulo-obtencion ?ALL)
    (export ?ALL)
)

;# EDAD

(defrule abstraer-edad-infantil
    (instancia-persona ?persona)
    (test (<= (send ?persona get-edad) 16))
    =>
    (assert (edad infantil))
    (format t "Grupo edad: infantil.%n")
)

(defrule abstraer-edad-adulto
    (instancia-persona ?persona)
    (test (and
        (> (send ?persona get-edad) 16)
        (<= (send ?persona get-edad) 67)
    ))
    =>
    (assert (edad adulto))
    (format t "Grupo edad: adulto.%n")
)

(defrule abstraer-edad-mayor
    (instancia-persona ?persona)
    (test (> (send ?persona get-edad) 67))
    =>
    (assert (edad mayor))
    (format t "Grupo edad: persona mayor.%n")
)

;# PERFIL DE ACTIVIDAD

(defrule abstraer-gasto-energetico-sedentaria
    (instancia-persona ?persona)
    =>
    (format t "Calorias %.2f m%n" (send ?persona get-gastoEnergeticoDiario))
    (if (<= (send ?persona get-gastoEnergeticoDiario) 4.0) then

        (assert (gasto-energetico sedentaria))
        (format t "Perfil sedentario.%n")
    )
    (if (and
        (> (send ?persona get-gastoEnergeticoDiario) 4.0)
        (<= (send ?persona get-gastoEnergeticoDiario) 13.0)) then

        (assert (gasto-energetico activa))
        (format t "Perfil activo.%n")
    )
    (if (> (send ?persona get-gastoEnergeticoDiario) 13.0) then

        (assert (gasto-energetico deportista))
    (format t "Perfil deportista.%n")
    )
    
)

;# ESTADO NUTRICIONAL

(defrule abstraer-estado-nutricional-infrapeso
    (instancia-persona ?persona)
    (test (<= (send ?persona IMC) 16))
    =>
    (assert (estado-nutricional infrapeso))
    (format t "Infrapeso.%n")
)

(defrule abstraer-estado-nutricional-normal
    (instancia-persona ?persona)
    (test (and
        (> (send ?persona IMC) 16)
        (<= (send ?persona IMC) 26)
    ))
    =>
    (assert (estado-nutricional normal))
    (format t "Peso normal.%n")
)

(defrule abstraer-estado-nutricional-sobrepeso
    (instancia-persona ?persona)
    (test (> (send ?persona IMC) 26))
    =>
    (assert (estado-nutricional sobrepeso))
    (format t "Sobrepeso.%n")
)

;#(defrule abstraer-problemas
;#  (instancia-persona ?persona)
;#  =>
;#  (bind ?problemas (send ?persona get-problemas))
;#  (loop-for-count (?i 1 (length$ ?problemas)) do
;#      (assert (problema (nth$ ?i ?problemas)))
;#  )
;#)

;#(defrule abstraer-objetivos
;#  (instancia-persona ?persona)
;#  =>
;#  (bind ?objetivos (send ?persona get-objetivos))
;#  (loop-for-count (?i 1 (length$ ?objetivos)) do
;#      (assert (objetivo (nth$ ?i ?objetivos)))
;#  )
;#)

;## CAMBIO DE MODULO ##########################################################
(defrule end-abstraccion
    (declare (salience -10000))
    =>
    (printout t "[END ABSTRACCION]" crlf crlf "[ASOCIACION]" crlf)
    (focus modulo-asociacion)
)
